home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 4 / FM Towns Free Software Collection 4 - Disc 1.iso / toda / src / quad.c < prev    next >
Text File  |  1991-10-18  |  14KB  |  538 lines

  1. /*        quad expand for video recordre    1990 6/8
  2. */
  3.  
  4. #include <stdlib.h>
  5. #include <math.h>
  6. #include <egb.h>
  7. #include <mos.h>
  8. #include "video.h"
  9.  
  10. #define C_WT 0x7fff        /* カーソル color */
  11. #define C_B 0x3ff        /* box color */
  12. #define C_PL 24311        /* 初期プレーン color */
  13. #define C_FL 0x303030        /* files back color */
  14. #define C_COLOR 15        /* Command color palette */
  15. #define W_COLOR 8        /* Window color palette */
  16. #define B_COLOR 7        /* Back color palette */
  17. #define E_COLOR 10        /* ERROR color palette */
  18. #define S1_COLOR 4        /* SCALE1 color palette */
  19. #define S2_COLOR 12        /* SCALE2 color palette */
  20.  
  21. extern error_check( int n );
  22. extern mouse( int para[], int xd, int yd, int mode );
  23. extern gprint( char *dsp, int x, int y );
  24. extern gprint2( char *dsp, int x, int y );
  25. extern itochar( int number, int x, char *dsp );
  26. extern windget();
  27. extern windput();
  28. /* extern mov_save_trim( int var[], int color ); */
  29. extern mov_save_page( char *name, int mode, int var[] );
  30. extern display_scale();
  31. extern polygon1( int para[], char *bbuf );
  32. extern polygon2( char *bbuf );
  33. extern polygon3( char *bbuf );
  34.  
  35. quad_expand(pvar,cvar,ework,gwork,bbuf)
  36. int pvar[];            /* page */
  37. int cvar[][2];            /* 座標 */
  38. char *ework, *gwork, *bbuf;
  39. {
  40.     int min,max,i,j,k,wt,sw,cx,cy,polysw,mode;
  41.     int mp[3];
  42.     int pp[5];
  43.     int data[2];
  44.     char dsp1[] = "<<EXPAND>>  SOURCE-RECTANGLE  START-QUADRANGLE  END-QUADRANGLE  PAGE=       EXIT";
  45.     char dsp2[] = "REC1  REC2  EXPAND(page    )  CANCEL            POLYGON-SET  POLYGON-OFF   TRACE";
  46.  
  47.     backupget(bbuf,gwork);        /* 全画面保存 */
  48.     polysw = pvar[4];
  49.     if( polysw )polygon2(bbuf);
  50. quad1:    windget();
  51.     gprint( dsp1, 0, 463 );
  52.     gprint( dsp2, 0, 479 );
  53.     EGB_color(ework,0,E_COLOR);
  54.     gprint( "REC1  REC2", 0, 479 );
  55.     EGB_color(ework,0,C_COLOR);
  56.     for( i = 0 ; i < 2 ; i++ )data[i] = -1;
  57.     quad_dsp(data,pvar);
  58. quad2:    MOS_disp(1);
  59.     mouse( mp, 0, 0, 1 );
  60.     sw = mp[0]; cx = mp[1]; cy = mp[2];
  61.     if( cy < 447 )goto quad2;
  62.     if( cy < 463 ){
  63.         if( cx < 88 )goto quad2;
  64.         if( cx < 232 ){            /* source 0 */
  65.             j = 0;
  66.             goto quad3;
  67.         }
  68.         if( cx < 376 ){            /* start_quad 1 */
  69.             j = 1;
  70.             goto quad3;
  71.         }
  72.         if( cx < 504 ){            /* end_quad 2 */
  73.             j = 2;
  74.             goto quad3;
  75.         }
  76.         if( cx < 584 ){            /* page */
  77.             i = 0; min = 2; max = 999;
  78.             goto quad7;
  79.         }
  80.         if( cx < 600 )goto quad2;
  81.         if( cx < 640 ){            /* exit 3 */
  82.             j = 3;
  83.             goto quad3;
  84.         }
  85.         goto quad2;
  86.     }
  87.     if( cy < 480 ){
  88.         if( cx < 40 ){            /* rec1 */
  89.             mode = 0;
  90.             j = 9;
  91.             goto quad3;
  92.         }
  93.         if( cx < 88 ){            /* rec2 */
  94.             mode = 1;
  95.             j = 9;
  96.             goto quad3;
  97.         }
  98.         if( cx < 148 ){            /* expand 4 */
  99.             j = 4;
  100.             goto quad3;
  101.         }
  102.         if( cx < 232 ){            /* page */
  103.             i = 1; min = 1; max = pvar[0];
  104.             goto quad7;
  105.         }
  106.         if( cx < 296 ){            /* cancel 5 */
  107.             j = 5;
  108.             goto quad3;
  109.         }
  110.         if( cx < 376 )goto quad2;
  111.         if( cx < 480 ){            /* POLYGON-SET 6 */
  112.             j = 6;
  113.             goto quad3;
  114.         }
  115.         if( cx < 584 ){            /* POLYGON-OFF 7 */
  116.             j = 7;
  117.             goto quad3;
  118.         }
  119.         if( cx < 592 )goto quad2;
  120.         if( cx < 640 ){            /* trace 8 */
  121.             j = 8;
  122.             goto quad3;
  123.         }
  124.         goto quad2;
  125.     }
  126.     goto quad2;
  127. quad3:    mouse(mp, 0, 0, 0);
  128.     sw = mp[0]; cx = mp[1]; cy = mp[2];
  129.     if( sw > 1 )goto quad2;
  130.     MOS_disp(0);
  131.     windput();
  132.     switch( j ){
  133.         case 0: rectangle_coodr( cvar,ework );    /* rectangole */
  134.             break;
  135.         case 1:    sourcebox_display(cvar,ework);
  136.             quad_coodr( cvar, 2, ework );    /* start quad */
  137.             sourcebox_display(cvar,ework);
  138.             break;
  139.         case 2:    sourcebox_display(cvar,ework);
  140.             quad_coodr( cvar, 6, ework );    /* end quad */
  141.             sourcebox_display(cvar,ework);
  142.             break;
  143.         case 3:    polygon2( bbuf );
  144.             return 0;            /* exit */
  145.         case 4:    polygon2( bbuf );        /* expand */
  146.             error_check(
  147.                 expand_copy(pvar,cvar,polysw,bbuf,ework,gwork)
  148.             );
  149.             polygon2( bbuf );
  150.             break;
  151.         case 5:    polygon2( bbuf );
  152.             backupput( bbuf, gwork );    /* cancel */
  153.             polygon2( bbuf );
  154.             break;
  155.         case 6:    polygon2( bbuf );
  156.             sourcebox_display(cvar,ework);
  157.             polysw = 1;
  158.             if( polygon1( pp, bbuf ) )polysw = 0;    /* polygon */
  159.             sourcebox_display(cvar,ework);
  160.             break;
  161.         case 7:    polygon2( bbuf );        /* polygon-off */
  162.             polygon3( bbuf );
  163.             polysw = 0;
  164.             break;
  165.         case 8:    sourcebox_display(cvar,ework);
  166.             quad_check( pvar[0], cvar, ework );  /* trace */
  167.             sourcebox_display(cvar,ework);
  168.             break;
  169.         case 9:    polygon2( bbuf );
  170.             if(
  171.                 error_check(
  172.                 mov_save_page(
  173.                      (char *)pvar[5], mode, (int *)pvar[3]
  174.                 )
  175.                 )
  176.             ){
  177.                 polygon3( bbuf );
  178.                 return -1;
  179.             }
  180.             polygon2( bbuf );
  181.             break;                /* rec */
  182.     }
  183.     goto quad1;
  184.  
  185. quad7:    wt = 125000;
  186. quad8:    if( sw == 1 )pvar[i] = pvar[i] + 1;
  187.     if( sw == 2 )pvar[i] = pvar[i] - 1;
  188.     if( pvar[i] < min )pvar[i] = max;
  189.     if( pvar[i] > max )pvar[i] = min;
  190.     quad_dsp(data,pvar);
  191.     for( k = 0 ; k < wt ; k++ );
  192.     wt = 10000;
  193.     MOS_rdpos(&sw,&cx,&cy);
  194.     if( sw > 0 )goto quad8;
  195.     goto quad2;
  196. }
  197.  
  198. quad_dsp(data,var)
  199. int data[],var[];
  200. {
  201.     int i, x, y;
  202.     int point[][3] = {    { 552,463,3 },
  203.                 { 192,479,3 }
  204.               };
  205.     char dsp[10];
  206.  
  207.     for( i = 0 ; i < 2 ; i++ ){
  208.         if( data[i] != var[i] ){
  209.         x = point[i][0]; y = point[i][1];
  210.             MOS_disp(0);
  211.             itochar( var[i], point[i][2], dsp );
  212.             gprint2( dsp, x, y );
  213.             data[i] = var[i];
  214.         }
  215.     }
  216.     return 0;
  217. }
  218.  
  219. backupget(bbuf,gwork)        /* 保存 */
  220. char *bbuf,*gwork;
  221. {
  222.     char para[8];
  223.  
  224.     DWORD(para+0) = (unsigned int)bbuf;
  225.     DWORD(para+4) = 0x104;
  226.     geta17(gwork,para);    /* polygon data 保存 1991 2/28 */
  227.     return 0;
  228. }
  229.  
  230. backupput(bbuf,gwork)        /* 画面バック(cancel) */
  231. char *bbuf,*gwork;
  232. {
  233.     char para[12];
  234.  
  235.     DWORD(para+0) = (unsigned int)bbuf;
  236.     DWORD(para+4) = 0x104;
  237.     DWORD(para+8) = 12;    /* 1991 2/28 特設 */
  238.     puta17(gwork,para);
  239.     return 0;
  240. }
  241.  
  242. sourcebox_display(var,ework)
  243. int var[][2];
  244. char *ework;
  245. {
  246.     char para[8];
  247.  
  248.     EGB_writePage(ework,0);        /* mode10に書き込み */
  249.     EGB_color(ework,0,C_B);
  250.     EGB_paintMode(ework,0x2);
  251.     EGB_writeMode(ework,4);
  252.     WORD(para + 0) = var[0][0];
  253.     WORD(para + 2) = var[0][1];
  254.     WORD(para + 4) = var[1][0];
  255.     WORD(para + 6) = var[1][1];
  256.     EGB_rectangle(ework,para);
  257.     return 0;
  258. }
  259.  
  260. rectangle_coodr( var, ework )
  261. int var[][2];
  262. char *ework;
  263. {
  264.     int sw, cx, cy, temp;
  265.     int v[2][2], mp[3];
  266.  
  267.     display_scale();
  268.     EGB_writePage(ework,0);        /* mode10に書き込み */
  269.     MOS_horizon(0,319);
  270.     MOS_vertical(0,239);
  271.     MOS_setpos( 160, 120 );
  272.     MOS_disp(0);
  273. cood1:    mouse(mp,0,0,10);
  274.     sw = mp[0]; cx = mp[1]; cy = mp[2];
  275.     if( sw > 1 )goto cood3;
  276.     v[0][0] = cx; v[0][1] = cy;
  277.     mouse(mp,0,0,4);
  278.     sw = mp[0]; cx = mp[1]; cy = mp[2];
  279.     if( sw > 1 )goto cood1;
  280.     if( cx == v[0][0] || cy == v[0][1] )goto cood3;
  281.     v[1][0] = cx; v[1][1] = cy;
  282.     if( v[0][0] > v[1][0] ){    /* 大小整頓 */
  283.         temp = v[0][0];
  284.         v[0][0] = v[1][0];
  285.         v[1][0] = temp;
  286.     }
  287.     if( v[0][1] > v[1][1] ){
  288.         temp = v[0][1];
  289.         v[0][1] = v[1][1];
  290.         v[1][1] = temp;
  291.     }
  292.     var[0][0]=v[0][0]; var[0][1]=v[0][1];
  293.     var[1][0]=v[1][0]; var[1][1]=v[1][1];
  294. cood3:    EGB_writePage(ework,1);        /* mode3に書き込み */
  295.     MOS_horizon(0,639);
  296.     MOS_vertical(0,479);
  297.     MOS_setpos( 320, 240 );
  298.     return 0;
  299. }
  300.  
  301. quad_coodr( var, n, ework )
  302. int var[][2],n;
  303. char *ework;
  304. {
  305.     int sw, cx, cy, i, bn;
  306.     int mp[3];
  307.     int b[6][2];
  308.  
  309.     display_scale();
  310.     EGB_writePage(ework,0);        /* mode10に書き込み */
  311.     MOS_horizon(0,319);
  312.     MOS_vertical(0,239);
  313.     MOS_setpos( 160, 120 );
  314.     MOS_disp(0);
  315. cood1:    mouse( mp, 0, 0, 10 );
  316.     sw = mp[0]; cx = mp[1]; cy = mp[2];
  317.     if( sw > 1 )goto cood2;
  318.     bn = 0; b[0][0] = cx; b[0][1] = cy;
  319.     while( bn < 3 ){
  320.         mouse( mp, 0, 0, 2 );
  321.         sw = mp[0]; cx = mp[1]; cy = mp[2];
  322.         if( sw > 1 ){
  323.             if( bn == 0 )goto cood1;
  324.             for( i=1 ; i<=bn ; i++ ){    /* やりなおし */
  325.                 line_set(
  326.                  b[i-1][0], b[i-1][1], b[i][0], b[i][1], ework
  327.                 );
  328.             }
  329.             goto cood1;
  330.         }
  331.         bn++; b[bn][0] = cx; b[bn][1] = cy;    /* 次のステップ */
  332.         line_set( b[bn-1][0], b[bn-1][1], b[bn][0], b[bn][1], ework );
  333.     }
  334.     bn = 4; b[4][0] = b[0][0]; b[4][1] = b[0][1];    /* 最後のライン */
  335.     line_set( b[3][0], b[3][1], b[4][0], b[4][1], ework );
  336.     for( i=1 ; i<=bn ; i++ ){            /* ライン消し */
  337.         line_set( b[i-1][0], b[i-1][1], b[i][0], b[i][1], ework );
  338.     }
  339.     if( error_check( square_check( b ) ) )goto cood2;
  340.     for( i=0 ; i<4 ; i++ ){
  341.         var[i+n][0] = b[i][0];
  342.         var[i+n][1] = b[i][1];
  343.     }
  344. cood2:    EGB_writePage(ework,1);        /* mode3に書き込み */
  345.     MOS_horizon(0,639);
  346.     MOS_vertical(0,479);
  347.     MOS_setpos( 320, 240 );
  348.     return 0;
  349. }
  350.  
  351. quad_check( n, var, ework )
  352. int n, var[][2];
  353. char *ework;
  354. {
  355.     int i, j, mp[3], outvar[5][2];
  356.  
  357.     for( i=0 ; i<10 ; i++ ){
  358.         if( var[i][0] < 0 ){    /* data check */
  359.             error_check( 4 );
  360.             return -1;
  361.         }
  362.     }
  363.     EGB_writePage(ework,0);        /* mode10に書き込み */
  364.     for( j=0 ; j<2 ; j++ ){
  365.         if( j )mouse( mp, 0, 0, 0 );
  366.         for( i=1 ; i<=n ; i++ ){
  367.             quad_out( i, outvar, n, var );
  368.             quad_line( outvar, ework );
  369.         }
  370.     }
  371.     EGB_writePage(ework,1);        /* mode3に書き込み */
  372.     return 0;
  373. }
  374.  
  375. expand_copy( pvar, var, polysw, bbuf, ework, gwork )
  376. int pvar[], var[][2], polysw;
  377. char *bbuf, *ework, *gwork;
  378. {
  379.     int p, n, col;            /* page1 page0 color */
  380.     int ax1, ay1, ax2, ay2;
  381.     int temp, i, xmin, ymin, xmax, ymax, ax, ay, axm, aym, det;
  382.     int bx0, by0, bx1, by1, bx2, by2, bx3, by3;
  383.     int b[6][2], para[18];
  384.     char para2[8];
  385.  
  386.     p = pvar[1]; n = pvar[0]; col = pvar[2];
  387.     if( p > n )return 54;            /* error check */
  388.     if( var[0][0] >= var[1][0] )return 4;
  389.     if( var[0][1] >= var[1][1] )return 4;
  390.     for( i=2 ; i<10 ; i++ ){
  391.         if( var[i][0] < 0 )return 4;
  392.     }
  393.     EGB_writePage(ework,0);        /* mode10に書き込み */
  394.     EGB_color(ework,0,col);        /* paint color set */
  395.     EGB_color(ework,2,col);
  396.     EGB_paintMode(ework,0x22);
  397.     EGB_writeMode(ework,0);
  398.     EGB_penSize(ework,1);
  399.     WORD(para2 +0 ) = 0;
  400.     WORD(para2 +2 ) = 0;
  401.     WORD(para2 +4 ) = 319;
  402.     WORD(para2 +6 ) = 239;
  403.     EGB_rectangle( ework, para2 );
  404.     quad_out( p, b, n, var );
  405.     if( ( temp = square_check( b ) ) != 0 )goto expnd1;
  406.     quad_line( b, ework );
  407.     if( polysw == 0 )polygon_box( var, bbuf );    /* polygon */
  408.     quad_line( b, ework );
  409.     para[0] = (unsigned int)bbuf;
  410.     para[1] = 0x104;
  411.     ax1 = var[0][0]; ay1 = var[0][1];
  412.     ax2 = var[1][0]; ay2 = var[1][1];
  413.     xmin = b[0][0]; xmax = b[0][0]; ymin = b[0][1]; ymax = b[0][1];
  414.     for( i=0 ; i<4 ; i++ ){                /* 最大,最小 */
  415.         if( xmin > b[i][0] )xmin = b[i][0];
  416.         if( xmax < b[i][0] )xmax = b[i][0];
  417.         if( ymin > b[i][1] )ymin = b[i][1];
  418.         if( ymax < b[i][1] )ymax = b[i][1];
  419.     }
  420.     bx0 = b[0][0]; by0 = b[0][1];
  421.     bx1 = b[1][0] - bx0; by1 = b[1][1] - by0;
  422.     bx2 = b[2][0] - bx0; by2 = b[2][1] - by0;
  423.     bx3 = b[3][0] - bx0; by3 = b[3][1] - by0;
  424.     ax = ax2 - ax1; ay = ay2 - ay1;
  425.     det = bx1*by3 - bx3*by1;
  426.     if( det == 0 ){
  427.         temp = 100;
  428.         goto expnd1;
  429.     }
  430.     para[2] =  ( ((double)ax)*by3*65536 )/det;
  431.     para[3] = -( ((double)ax)*bx3*65536 )/det;
  432.     para[4] = -( ((double)ay)*by1*65536 )/det;
  433.     para[5] =  ( ((double)ay)*bx1*65536 )/det;
  434.     axm = para[2]*bx2 + para[3]*by2;
  435.     aym = para[4]*bx2 + para[5]*by2;
  436.     if( (axm == 0) || (aym == 0) ){
  437.         temp = 100;    /* axm*aym==0はerror god-transも同じ */
  438.         goto expnd1;    /* overflow=0になる↑対処せよ91 2・25 */
  439.     }
  440.     para[6] = ( (double)( axm - ax*65536 ) )/ax/aym*65536;
  441.     para[7] = ( (double)( aym - ay*65536 ) )/ay/axm*65536;
  442.     para[8] = bx0; para[9] = by0;
  443.     para[10] = ax1 * 65536; para[11] = ay1 * 65536;
  444.     para[12] = xmin; para[13] = ymin; para[14] = xmax; para[15] = ymax;
  445.     para[16] = 256;
  446.     expand17( gwork, para );
  447. expnd1:    if( polysw == 0 )poly1(bbuf);    /* polygon data clear */
  448.     EGB_writePage(ework,1);        /* mode3に書き込み */
  449.     return temp;
  450. }
  451.  
  452. polygon_box( var, bbuf )    /* box area set */
  453. int var[][2];
  454. char *bbuf;
  455. {
  456.     int x1, x2, y, address;
  457.  
  458.     poly1(bbuf);            /* polygon data clear */
  459.     x1 = var[0][0]; x2 = var[1][0];
  460.     for( y=var[0][1] ; y<=var[1][1] ; y++ ){
  461.         address = y * 1024 + x1 * 2;
  462.         WORD( bbuf + address ) = WORD( bbuf + address ) | 0x8000;
  463.         address = y * 1024 + x2 * 2;
  464.         WORD( bbuf + address ) = WORD( bbuf + address ) | 0x8000;
  465.     }
  466.     poly2( bbuf, var[0][1], var[1][1] );
  467.     return 0;
  468. }
  469.  
  470. /* nページ分割 var[2][0]-var[9][2] → pページ出力 outvar[0][0]-outvar[3][2] */
  471.  
  472. quad_out( p, outvar, n, var )
  473. int p, outvar[5][2], n, var[][2];
  474. {
  475.     int i, m, m1, m2;
  476.  
  477.     m = n - 1; m1 = p - 1; m2 = m - m1;
  478.     for( i=0 ; i<4 ; i++ ){
  479.         outvar[i][0] = ( m2*var[i+2][0] + m1*var[i+6][0] ) / m;
  480.         outvar[i][1] = ( m2*var[i+2][1] + m1*var[i+6][1] ) / m;
  481.     }
  482.     outvar[4][0] = outvar[0][0]; outvar[4][1] = outvar[0][1];
  483.     return square_check(outvar);        /* 外積チェック */
  484. }
  485.  
  486. quad_line( var, ework )
  487. int var[5][2];
  488. char *ework;
  489. {
  490.     int i;
  491.  
  492.     for( i=1 ; i<=4 ; i++ ){            /* ライン */
  493.         line_set( var[i-1][0], var[i-1][1], var[i][0], var[i][1], ework );
  494.     }
  495.     return 0;
  496. }
  497.  
  498. line_set( x1, y1, x2, y2, ework )
  499. int x1, y1, x2, y2;
  500. char *ework;
  501. {
  502.     char para[32];
  503.  
  504.  
  505.     EGB_color(ework,0,C_WT);
  506.     EGB_writeMode( ework, 4 );        /* XOR */
  507.     EGB_paintMode( ework, 0x22 );
  508.     WORD( para+0 ) = 2;
  509.     WORD( para+2 ) = x1;
  510.     WORD( para+4 ) = y1;
  511.     WORD( para+6 ) = x2;
  512.     WORD( para+8 ) = y2;
  513.     EGB_unConnect( ework, para );
  514.     return 0;
  515. }
  516.  
  517. square_check(b)        /* 外積チェック */
  518. int b[5][2];
  519. {
  520.     int data[4], a[4][2];
  521.  
  522.     a[0][0] = b[1][0] - b[0][0];    /* ベクトル */
  523.     a[0][1] = b[1][1] - b[0][1];
  524.     a[1][0] = b[2][0] - b[1][0];
  525.     a[1][1] = b[2][1] - b[1][1];
  526.     a[2][0] = b[3][0] - b[2][0];
  527.     a[2][1] = b[3][1] - b[2][1];
  528.     a[3][0] = b[0][0] - b[3][0];
  529.     a[3][1] = b[0][1] - b[3][1];
  530.     data[0] = a[0][0]*a[1][1] - a[0][1]*a[1][0];    /* 外積 */
  531.     data[1] = a[1][0]*a[2][1] - a[1][1]*a[2][0];
  532.     data[2] = a[2][0]*a[3][1] - a[2][1]*a[3][0];
  533.     data[3] = a[3][0]*a[0][1] - a[3][1]*a[0][0];
  534.     if( ((double)data[0])*data[1]*data[2]*data[3] > 0 )return 0;
  535.     return 100;
  536. }
  537.  
  538.